package cn.yx.common.mybatis.mapper;

import cn.yx.common.core.pojo.singletable.SingleCond;
import cn.yx.common.mybatis.pojo.SingleDo;

import java.io.Serializable;
import java.util.List;

/**
 * <p>BaseMapper接口，定义了常用的Mapper方法，实现CRUD操作</p>
 *
 * @param <Do>   DO类
 * @param <Cond> Cond类
 * @param <Id>   ID主键值类
 * @author Wgssmart
 */
public interface BaseMapper<Do extends SingleDo,
        Cond extends SingleCond,
        Id extends Serializable> {

    /**
     * 插入数据到数据库中
     *
     * @param entity DO实体类
     * @return 返回插入的行数
     */
    int insert(Do entity);

    /**
     * 批量插入数据到数据库中
     *
     * @param entityList DO实体类集合
     * @return 返回插入的行数
     */
    int insertBatch(List<Do> entityList);

    /**
     * 根据主键从数据库中删除数据
     *
     * @param id 主键ID
     * @return 返回删除的行数
     */
    int deleteById(Id id);

    /**
     * 根据多个主键批量删除数据
     *
     * @param idList 多个主键组成的集合
     * @return 返回删除的行数
     */
    int deleteBatchIds(List<Id> idList);

    /**
     * 根据条件删除数据
     *
     * @param cond 删除条件
     * @return 返回删除的行数
     */
    int delete(Cond cond);

    /**
     * 根据主键更新数据库中的数据
     *
     * @param entity DO实体类
     * @return 返回更新的行数
     */
    int updateById(Do entity);

    /**
     * 根据对象集合批量更新数据库中的数据
     *
     * @param entityList DO实体类集合
     * @return 返回更新的行数
     */
    int updateBatchIds(List<Do> entityList);

    /**
     * 根据主键更新数据库中的数据，如果DTO中的属性为null，则字段更新为null
     *
     * @param entity DO实体类，如果属性为null，字段也更新为null
     * @return 返回更新的行数
     */
    int updateAllColumnById(Do entity);

    /**
     * 根据对象集合批量更新数据库中的数据，如果DTO中的属性为null，则字段更新为null
     *
     * @param entityList DO实体类集合，如果属性为null，字段也更新为null
     * @return 返回更新的行数
     */
    int updateAllColumnBatchIds(List<Do> entityList);

    /**
     * 根据主键id查找数据
     *
     * @param id 主键字段值
     * @return 主键字段对应记录的DO对象
     */
    Do selectById(Id id);

    /**
     * 根据主键集合查找数据
     *
     * @param idList 主键集合
     * @return 主键集合对应的多个DO对象
     */
    List<Do> selectBatchIds(List<Id> idList);

    /**
     * 根据条件查找单个对象
     *
     * @param cond
     * @return
     */
    Do selectOne(Cond cond);

    /**
     * 根据条件查询对象查找符合条件的所有数据
     *
     * @param cond 条件查询对象
     * @return 按照条件的所有数据DO对象组成的List列表
     */
    List<Do> selectList(Cond cond);

    /**
     * 根据分页查询对象和条件查询对象查找数据
     *
     * @param cond 条件查询对象，包括分页数据
     * @return 按照条件的分页数据DO对象所组成的List列表
     */
    List<Do> selectPage(Cond cond);

    /**
     * 根据条件查询对象计数
     *
     * @param cond 条件查询对象
     * @return 按照条件查询对象的记录数
     */
    Long selectCount(Cond cond);

    /**
     * 根据主键获取记录版本号
     *
     * @param id 主键字段值
     * @return 记录版本号
     */
    Integer selectVersionById(Id id);

    /**
     * 是否存在指定主键的数据，返回存在的数据的主键值
     *
     * @param id 主键值字段
     * @return 存在的数据的主键值，如果不存在数据，返回null
     */
    Id existId(Id id);

    /**
     * 是否存在指定主键的多条数据，返回存在的数据的主键值
     *
     * @param idList 主键集合
     * @return 存在的数据的主键值集合，如果不存在数据，返回空集合
     */
    List<Id> existBatchIds(List<Id> idList);

    /**
     * 是否存在指定条件的多条数据，返回存在的数据的主键值
     *
     * @param selectCond 查询条件
     * @return 存在的数据的主键值集合，如果不存在数据，返回空集合
     */
    List<Id> existIds(Cond selectCond);

}
